Node.js DiffieHellman Reference

Node.js

DiffieHellman Object

DiffieHellman ক্লাস Node.js এর ক্রিপ্টো মডিউলের অংশ। এটি ডিফি-হেলম্যান কী এক্সচেঞ্জ প্রোটোকল প্রয়োগ করে, যা দুটি পক্ষকে নিরাপদে একটি অনিরাপদ চ্যানেলে একটি ভাগ করা গোপনীয়তা স্থাপন করতে দেয়।

Import Crypto Module

// Import the crypto module
const crypto = require('crypto');

// Create a DiffieHellman instance
const dh = crypto.createDiffieHellman(2048); // 2048-bit prime length

DiffieHellman Methods

পদ্ধতি ব্যাখ্যা
dh.generateKeys([encoding]) ব্যক্তিগত এবং সর্বজনীন ডিফি-হেলম্যান কী মান তৈরি করে। এনকোডিং প্রদান করা হলে, একটি স্ট্রিং ফেরত দেওয়া হয়; অন্যথায়, একটি বাফার ফেরত দেওয়া হয়।
dh.computeSecret(otherPublicKey[, inputEncoding][, outputEncoding]) অন্য পক্ষের সর্বজনীন কী ব্যবহার করে ভাগ করা গোপনীয়তা গণনা করে৷ যদি ইনপুট এনকোডিং প্রদান করা হয়, অন্যপাবলিককি একটি স্ট্রিং হবে বলে আশা করা হয়; অন্যথায়, একটি বাফার, TypedArray, বা DataView. আউটপুট এনকোডিং প্রদান করা হলে, একটি স্ট্রিং প্রদান করা হয়; অন্যথায়, একটি বাফার ফেরত দেওয়া হয়।
dh.getPrime([encoding]) ডিফি-হেলম্যান প্রিন্সিপাল ফেরত দেয়। এনকোডিং প্রদান করা হলে, একটি স্ট্রিং ফেরত দেওয়া হয়; অন্যথায়, একটি বাফার ফেরত দেওয়া হয়।
dh.getGenerator([encoding]) ডিফি-হেলম্যান জেনারেটর ফেরত দেয়। এনকোডিং প্রদান করা হলে, একটি স্ট্রিং ফেরত দেওয়া হয়; অন্যথায়, একটি বাফার ফেরত দেওয়া হয়।
dh.getPublicKey([encoding]) Diffie-Hellman পাবলিক কী ফেরত দেয়। এনকোডিং প্রদান করা হলে, একটি স্ট্রিং ফেরত দেওয়া হয়; অন্যথায়, একটি বাফার ফেরত দেওয়া হয়।
dh.getPrivateKey([encoding]) ডিফি-হেলম্যান ব্যক্তিগত কী ফেরত দেয়। এনকোডিং প্রদান করা হলে, একটি স্ট্রিং ফেরত দেওয়া হয়; অন্যথায়, একটি বাফার ফেরত দেওয়া হয়।
dh.setPublicKey(publicKey[, encoding]) Diffie-Hellman পাবলিক কী সেট করে। এনকোডিং প্রদান করা হলে, publicKey একটি স্ট্রিং হবে বলে আশা করা হয়; অন্যথায়, একটি বাফার, TypedArray, বা DataView.
dh.setPrivateKey(privateKey[, encoding]) Diffie-Hellman ব্যক্তিগত কী সেট করে। যদি এনকোডিং প্রদান করা হয়, প্রাইভেটকি একটি স্ট্রিং হবে বলে আশা করা হয়; অন্যথায়, একটি বাফার, TypedArray, বা DataView.
dh.verifyError ফ্ল্যাগ বিট ক্ষেত্র যা শুরু বা বৈধতা পরীক্ষা চলাকালীন কোন ত্রুটির সম্মুখীন হয় তা নির্দেশ করে।

Creating DiffieHellman Instances

একটি DiffieHellman উদাহরণ তৈরি করার বিভিন্ন উপায় আছে:

const crypto = require('crypto');

// Method 1: Generate a new DH group with specified prime length
const dh1 = crypto.createDiffieHellman(2048);
console.log('Generated prime length:', dh1.getPrime().length * 8, 'bits');

// Method 2: Create a DH group using a predefined prime
const prime = Buffer.from('prime-number-in-hex', 'hex');
const dh2 = crypto.createDiffieHellman(prime);

// Method 3: Create a DH group using a predefined prime and generator
const generator = Buffer.from('02', 'hex'); // Often 2, 5, or other small values
const dh3 = crypto.createDiffieHellman(prime, generator);

// Method 4: Using predefined groups with getDiffieHellman()
const predefinedGroupName = 'modp14'; // RFC 3526 2048-bit MODP Group
const dh4 = crypto.getDiffieHellman(predefinedGroupName);

getDiffieHellman() পদ্ধতি নিম্নলিখিত পূর্বনির্ধারিত গোষ্ঠীগুলিকে সমর্থন করে:

গ্রুপের নাম ব্যাখ্যা আকার
modp1 RFC 2409 768-bit MODP Group 768 bits
modp2 RFC 2409 1024-bit MODP Group 1024 bits
modp5 RFC 3526 1536-bit MODP Group 1536 bits
modp14 RFC 3526 2048-bit MODP Group 2048 bits
modp15 RFC 3526 3072-bit MODP Group 3072 bits
modp16 RFC 3526 4096-bit MODP Group 4096 bits
modp17 RFC 3526 6144-bit MODP Group 6144 bits
modp18 RFC 3526 8192-bit MODP Group 8192 bits

Basic Key Exchange Example

নিম্নলিখিত উদাহরণটি দুটি পক্ষের (এলিস এবং বব) মধ্যে মৌলিক ডিফি-হেলম্যান কী বিনিময়কে চিত্রিত করে:

const crypto = require('crypto');

// Alice generates parameters and keys
console.log('Alice: Creating DiffieHellman instance...');
const alice = crypto.createDiffieHellman(2048);
const aliceKeys = alice.generateKeys();

// Bob also needs parameters from Alice
console.log('Alice: Sending parameters to Bob...');
const p = alice.getPrime();
const g = alice.getGenerator();

// Bob creates a DiffieHellman instance with the same parameters
console.log('Bob: Creating DiffieHellman instance with Alice\'s parameters...');
const bob = crypto.createDiffieHellman(p, g);
const bobKeys = bob.generateKeys();

// Exchange public keys (over an insecure channel)
console.log('Exchanging public keys...');
const alicePublicKey = alice.getPublicKey();
const bobPublicKey = bob.getPublicKey();

// Alice computes the shared secret using Bob's public key
console.log('Alice: Computing shared secret...');
const aliceSecret = alice.computeSecret(bobPublicKey);

// Bob computes the shared secret using Alice's public key
console.log('Bob: Computing shared secret...');
const bobSecret = bob.computeSecret(alicePublicKey);

// Both secrets should be the same
console.log('Alice\'s secret:', aliceSecret.toString('hex'));
console.log('Bob\'s secret:', bobSecret.toString('hex'));
console.log('Do they match?', aliceSecret.equals(bobSecret));

// This shared secret can now be used as a key for symmetric encryption

Using Predefined Groups

প্রমিত অ্যাপ্লিকেশনগুলির জন্য, পূর্বনির্ধারিত গোষ্ঠীগুলি ব্যবহার করে সামঞ্জস্যতা নিশ্চিত করবে:

const crypto = require('crypto');

// Using the RFC 3526 MODP Group 14 (2048 bits)
console.log('Alice: Creating DiffieHellman using predefined group...');
const alice = crypto.getDiffieHellman('modp14');
alice.generateKeys();

// Bob also uses the same predefined group
console.log('Bob: Creating DiffieHellman using predefined group...');
const bob = crypto.getDiffieHellman('modp14');
bob.generateKeys();

// Exchange public keys (over an insecure channel)
console.log('Exchanging public keys...');
const alicePublicKey = alice.getPublicKey();
const bobPublicKey = bob.getPublicKey();

// Compute shared secrets
const aliceSecret = alice.computeSecret(bobPublicKey);
const bobSecret = bob.computeSecret(alicePublicKey);

// Verify that the shared secrets match
console.log('Do the shared secrets match?', aliceSecret.equals(bobSecret));

// Output information about the group
console.log('Group prime size:', alice.getPrime().length * 8, 'bits');
console.log('Generator value:', alice.getGenerator().toString('hex'));

Diffie-Hellman with Encryption

এই উদাহরণটি AES এনক্রিপশনের জন্য একটি ভাগ করা কী স্থাপন করতে Diffie-Hellman ব্যবহার করার একটি সম্পূর্ণ দৃশ্য দেখায়:

const crypto = require('crypto');

// Create DiffieHellman instances for Alice and Bob
const alice = crypto.createDiffieHellman(2048);
alice.generateKeys();

// Bob uses Alice's parameters
const bob = crypto.createDiffieHellman(alice.getPrime(), alice.getGenerator());
bob.generateKeys();

// Exchange public keys
const alicePublicKey = alice.getPublicKey();
const bobPublicKey = bob.getPublicKey();

// Compute shared secrets
const aliceSecret = alice.computeSecret(bobPublicKey);
const bobSecret = bob.computeSecret(alicePublicKey);

// Use the shared secret as a key for encryption
// First, derive a suitable key using a hash function
function deriveKey(secret, salt, keyLength) {
  return crypto.pbkdf2Sync(secret, salt, 1000, keyLength, 'sha256');
}

// Alice sends an encrypted message to Bob
function encrypt(text, secret) {
  // Create a salt and derive a key
  const salt = crypto.randomBytes(16);
  const key = deriveKey(secret, salt, 32); // 32 bytes for AES-256
  const iv = crypto.randomBytes(16);
  
  // Encrypt the message
  const cipher = crypto.createCipheriv('aes-256-cbc', key, iv);
  let encrypted = cipher.update(text, 'utf8', 'hex');
  encrypted += cipher.final('hex');
  
  // Return everything Bob needs to decrypt
  return {
    salt: salt.toString('hex'),
    iv: iv.toString('hex'),
    encrypted
  };
}

// Bob decrypts the message from Alice
function decrypt(encryptedInfo, secret) {
  // Parse values
  const salt = Buffer.from(encryptedInfo.salt, 'hex');
  const iv = Buffer.from(encryptedInfo.iv, 'hex');
  const encrypted = encryptedInfo.encrypted;
  
  // Derive the same key
  const key = deriveKey(secret, salt, 32);
  
  // Decrypt the message
  const decipher = crypto.createDecipheriv('aes-256-cbc', key, iv);
  let decrypted = decipher.update(encrypted, 'hex', 'utf8');
  decrypted += decipher.final('utf8');
  
  return decrypted;
}

// Alice encrypts a message using the shared secret
const message = 'Hello Bob, this is a secret message from Alice!';
console.log('Original message:', message);

const encryptedMessage = encrypt(message, aliceSecret);
console.log('Encrypted message:', encryptedMessage);

// Bob decrypts the message using his shared secret
const decryptedMessage = decrypt(encryptedMessage, bobSecret);
console.log('Decrypted message:', decryptedMessage);

Working with Custom Parameters

যখন ডিফি-হেলম্যানের নির্দিষ্ট পরামিতি প্রয়োজন হয়:

const crypto = require('crypto');

// Custom prime and generator values
// These would normally be carefully chosen for security
const primeHex = `
  ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74
  020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f1437
  4fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7ed
  ee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf05
  98da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb
  9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3b
  e39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf695581718
  3995497cea956ae515d2261898fa051015728e5a8aacaa68ffffffffffffffff
`.replace(/\s+/g, '');

const prime = Buffer.from(primeHex, 'hex');
const generator = Buffer.from('02', 'hex');

// Create DiffieHellman with custom parameters
const dh = crypto.createDiffieHellman(prime, generator);

// Generate keys
dh.generateKeys();

// Verify the parameters
console.log('Using custom prime of length:', prime.length * 8, 'bits');
console.log('Generator:', generator.toString('hex'));

// Validation
console.log('Verify error code:', dh.verifyError);
if (dh.verifyError) {
  console.error('The parameters did not pass validation!');
} else {
  console.log('The parameters passed validation.');
}

// Output public and private keys
console.log('Public key length:', dh.getPublicKey().length * 8, 'bits');
console.log('Private key length:', dh.getPrivateKey().length * 8, 'bits');

Key Generation with Specific Encoding

DiffieHellman কীগুলির সাথে কাজ করার সময় আপনি কোড নির্দিষ্ট করতে পারেন:

const crypto = require('crypto');

// Create DiffieHellman instance
const dh = crypto.createDiffieHellman(1024);

// Generate keys
dh.generateKeys();

// Get keys and parameters with different encodings
console.log('With Buffer (default):');
console.log('  - Prime:', dh.getPrime());
console.log('  - Generator:', dh.getGenerator());
console.log('  - Public Key:', dh.getPublicKey());
console.log('  - Private Key:', dh.getPrivateKey());

console.log('\nWith hex encoding:');
console.log('  - Prime:', dh.getPrime('hex'));
console.log('  - Generator:', dh.getGenerator('hex'));
console.log('  - Public Key:', dh.getPublicKey('hex'));
console.log('  - Private Key:', dh.getPrivateKey('hex'));

console.log('\nWith base64 encoding:');
console.log('  - Prime:', dh.getPrime('base64'));
console.log('  - Generator:', dh.getGenerator('base64'));
console.log('  - Public Key:', dh.getPublicKey('base64'));
console.log('  - Private Key:', dh.getPrivateKey('base64'));

// Set keys using specific encoding
const newPublicKey = crypto.randomBytes(dh.getPrime().length - 10);
dh.setPublicKey(newPublicKey);
console.log('\nAfter setting new public key:');
console.log('  - Public Key (hex):', dh.getPublicKey('hex'));

Error Handling

ক্রিপ্টোগ্রাফিক ফাংশনগুলির সাথে কাজ করার সময় ত্রুটি পরিচালনা করা গুরুত্বপূর্ণ:

const crypto = require('crypto');

// Function to safely create DiffieHellman
function createDHSafely(options) {
  try {
    let dh;
    
    if (typeof options === 'number') {
      // Create with prime length
      dh = crypto.createDiffieHellman(options);
    } else if (options.group) {
      // Create with predefined group
      dh = crypto.getDiffieHellman(options.group);
    } else if (options.prime) {
      // Create with custom prime and optional generator
      const prime = Buffer.from(options.prime, options.encoding || 'hex');
      const generator = options.generator ?
        Buffer.from(options.generator, options.encoding || 'hex') :
        undefined;
      
      dh = generator ?
        crypto.createDiffieHellman(prime, generator) :
        crypto.createDiffieHellman(prime);
    } else {
      throw new Error('Invalid options for DiffieHellman creation');
    }
    
    // Check for errors
    if (dh.verifyError) {
      const errors = [];
      // Check specific error flags
      if (dh.verifyError & crypto.constants.DH_CHECK_P_NOT_SAFE_PRIME)
        errors.push('DH_CHECK_P_NOT_SAFE_PRIME');
      if (dh.verifyError & crypto.constants.DH_CHECK_P_NOT_PRIME)
        errors.push('DH_CHECK_P_NOT_PRIME');
      if (dh.verifyError & crypto.constants.DH_UNABLE_TO_CHECK_GENERATOR)
        errors.push('DH_UNABLE_TO_CHECK_GENERATOR');
      if (dh.verifyError & crypto.constants.DH_NOT_SUITABLE_GENERATOR)
        errors.push('DH_NOT_SUITABLE_GENERATOR');
      
      throw new Error(`DiffieHellman parameter validation failed: ${errors.join(', ')}`);
    }
    
    return dh;
  } catch (error) {
    console.error('Error creating DiffieHellman instance:', error.message);
    throw error;
  }
}

// Test with valid options
try {
  const dh1 = createDHSafely(2048);
  console.log('Successfully created DH with 2048-bit prime');
  
  const dh2 = createDHSafely({ group: 'modp14' });
  console.log('Successfully created DH with predefined group modp14');
} catch (error) {
  console.error('Error in valid tests:', error.message);
}

// Test with invalid options
try {
  // Invalid prime value
  const invalidPrime = '12345'; // Too short, not a prime
  const dh3 = createDHSafely({
    prime: invalidPrime,
    encoding: 'hex'
  });
} catch (error) {
  console.error('Expected error with invalid prime:', error.message);
}

try {
  // Invalid group name
  const dh4 = createDHSafely({ group: 'nonexistent-group' });
} catch (error) {
  console.error('Expected error with invalid group:', error.message);
}

Security Considerations

ডিফি-হেলম্যান কী এক্সচেঞ্জ ব্যবহার করার সময়, এই নিরাপত্তার সর্বোত্তম অনুশীলনগুলি বিবেচনা করুন:

উপযুক্ত বল মাত্রা ব্যবহার করুন:আধুনিক অ্যাপ্লিকেশনের জন্য, কমপক্ষে 2048-বিট প্রিন্সিপাল ব্যবহার করুন।
যাচাইকৃত গ্রুপ ব্যবহার করুন:যখনই সম্ভব, RFC-তে সংজ্ঞায়িত প্রমিত গ্রুপ ব্যবহার করুন।
ব্যক্তিগত কী রক্ষা করুন:লগ, ডিবাগ আউটপুট বা ক্লায়েন্ট-সাইড কোডে ব্যক্তিগত কীগুলি প্রকাশ করবেন না।
প্রমাণীকরণ যোগ করুন:বিশুদ্ধ ডিফি-হেলম্যান সালিসি আক্রমণের জন্য ঝুঁকিপূর্ণ। ডিজিটাল স্বাক্ষর সহ ECDHE এর মতো প্রমাণীকৃত কী বিনিময় প্রোটোকল ব্যবহার করার কথা বিবেচনা করুন।
পরামিতি যাচাই করুন:পরামিতি বৈধ কিনা তা নিশ্চিত করতে সর্বদা dh.verifyError চেক করুন।
স্বল্পমেয়াদী কী ব্যবহার করুন:ফরোয়ার্ড গোপনীয়তা প্রদান করতে প্রতিটি সেশনের জন্য নতুন কী তৈরি করুন।
এনক্রিপশন কীগুলি ডান পান:শেয়ার্ড সিক্রেটকে সরাসরি এনক্রিপশন কী হিসেবে ব্যবহার করবেন না। একটি কী ডেরিভেশন ফাংশন (KDF) যেমন HKDF বা PBKDF2 ব্যবহার করুন।

Comparing with ECDH

ডিফি-হেলম্যান (ডিএইচ) এবং উপবৃত্তাকার কার্ভ ডিফি-হেলম্যান (ইসিডিএইচ) উভয়ই মূল স্থানান্তর প্রোটোকল, তবে ইসিডিএইচ সুবিধাগুলি অফার করে:

বৈশিষ্ট্য DiffieHellman ECDH
বল আকার সাধারণত 2048-4096 বিট সাধারণত 256-384 বিট
কর্মক্ষমতা ধীর, আরো গণনা প্রয়োজন দ্রুত, আরো দক্ষ
নিরাপত্তা স্তর 2048-বিট DH ≈ 112-বিট নিরাপত্তা 256-বিট ECDH ≈ 128-বিট নিরাপত্তা
মেমরি ব্যবহার আরো কম
আধুনিক ব্যবহার নতুন ডিজাইনে কম সাধারণ নতুন প্রোটোকলগুলিতে খুব সাধারণ

💡গুরুত্বপূর্ণ নোট:

ECDH এর উচ্চতর কর্মক্ষমতা এবং ছোট বল আকারের জন্য বেশিরভাগ আধুনিক অ্যাপ্লিকেশনগুলিতে পছন্দ করা হয়।

অনুশীলন করুন

Node.js DiffieHellman .

crypto.createDH()
✗ ভুল! "crypto.createDH()" Node.js-এ একটি বৈধ পদ্ধতি নয়
crypto.createDiffieHellman()
✓ ঠিক আছে! "crypto.createDiffieHellman()" হল সঠিক পদ্ধতি যা Node.js-এ একটি DiffieHellman উদাহরণ তৈরি করতে ব্যবহৃত হয়
crypto.makeDiffieHellman()
✗ ভুল! "crypto.makeDiffieHellman()" Node.js-এ একটি বৈধ পদ্ধতি নয়
crypto.initDiffieHellman()
✗ ভুল! "crypto.initDiffieHellman()" Node.js-এ একটি বৈধ পদ্ধতি নয়